import {wxApi} from "../api/WxApi";
import {HttpResponse} from "../entity/HttpResponse";
import Common from "../../framework/utils/Common";
import Toast from "../popups/Toast";
import LocalStorage from "../../framework/utils/LocalStorage";
import {clearConfigs} from "../entity/ConfigHelper";
import Wx from "../../framework/wx/Wx";

/**
 * 用于全局配置的公共基础类.
 */
export class GlobalConfigBase {

    private static readonly configName: string = "global_config";

    public readonly version: string = "1.0";

    // 是否需要清除当前版本数据.清除操作需要同步清除网络数据,因此需要依赖登录成功的过程.
    // 通过记录标记来延后判断是否需要清除数据.
    public readonly needClear: boolean = false;

    // 清除本地数据的标记. 通过对比seq是否变化来区分是否需要清除本地数据.
    public readonly clearFlag: { seq: number, keys: string[] } = {seq: 1, keys: []};

    public init() {
        wxApi.getGlobalConfig().then(response => {
            if (HttpResponse.isOk(response)) {

                // 从本地读取.
                LocalStorage.getObj("config_" + GlobalConfigBase.configName, this);

                const newCfg: GlobalConfigBase = response.data as GlobalConfigBase;

                let clear = false;

                // 判断如果服务端没有配置信息的话,自动向上提交一份默认配置.
                if (newCfg && !newCfg.clearFlag) {
                    const defConfig = this.constructor();
                    // @ts-ignore 新版本配置的版本号应当与response同步,不能又被恢复成1.0
                    defConfig.version = response.version;
                    Common.assign(this, defConfig);
                    wxApi.uploadGlobalConfig(this);
                }
                // 初始seq 不应该清除.因为已经是全新的版本了.
                if (newCfg.clearFlag && newCfg.clearFlag.seq
                    && this.clearFlag.seq && this.clearFlag.seq !== newCfg.clearFlag.seq) {
                    // 新版本的配置文件将直接覆盖旧版本.
                    if (this.version == response.version) {
                        console.warn("检测到数据清除标记,开始清除数据.");
                        Toast.showToast("需要清除数据,成功清除后程序将自动退出.");
                        clear = true;
                    } else {
                        cc.log("发现新版本配置信息.直接替换.", this.version, newCfg.version)
                    }
                }

                // 深拷贝会导致keys中残留旧的待清除key.
                Common.assign(this, newCfg);

                // @ts-ignore 本地存储时,不应将此临时标记存为true.
                this.needClear = false;

                // 存储到本地.
                LocalStorage.setObj("config_" + GlobalConfigBase.configName, this);

                // @ts-ignore
                this.needClear = clear;

                if (this.needClear && wxApi.isLogined()) {
                    clearConfigs(this.clearFlag.keys).then(() => {
                        Wx.exit();
                    });
                }
            }
        }).catch(e => {
            console.log("===========出错了:", e)
        })
    }
}